package dongshi.daddy.main;

import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import dongshi.daddy.service.ProviderService;
import dongshi.daddy.service.ProviderServiceImpl;

// 使用API配置方式服务提供者
// 这种方式为硬编码方式，官方不推荐，一般在写测试用例的时候使用
public class ProviderWithApiConfigMain {

    public static void main(String[] args) {
        // 服务实现
        ProviderService providerService = new ProviderServiceImpl();

        // 当前应用配置
        // 相当于xml配置：<dubbo:application name="dongshidaddy-provider" owner="dongshidaddy">
        ApplicationConfig application = new ApplicationConfig();
        application.setName("dongshidaddy-provider");
        application.setOwner("dongshidaddy");

        // 连接注册中心配置
        // 相当于xml配置：<dubbo:registry address="zookeeper://192.168.10.119:2181" />
        RegistryConfig registry = new RegistryConfig();
        registry.setAddress("zookeeper://192.168.10.119:2181");

        // 服务提供者协议配置
        // 相当于xml配置：<dubbo:protocol name="dubbo" port="20823"/>
        ProtocolConfig protocol = new ProtocolConfig();
        protocol.setName("dubbo");
        protocol.setPort(20824);

        // 注意：ServiceConfig为重对象，内部封装了与注册中心的连接，以及开启服务端口

        // 服务提供者暴露服务配置
        // 相当于xml配置：
        /*
        <dubbo:service
        interface="dongshi.daddy.service.ProviderService"
        ref="providerService"/>
         */
        ServiceConfig<ProviderService> service = new ServiceConfig<ProviderService>(); // 此实例很重，封装了与注册中心的连接，请自行缓存，否则可能造成内存和连接泄漏
        service.setApplication(application);
        service.setRegistry(registry); // 多个注册中心可以用setRegistries()
        service.setProtocol(protocol); // 多个协议可以用setProtocols()
        service.setInterface(ProviderService.class);
        service.setRef(providerService);
//        service.setVersion("1.0.0");

        // 暴露及注册服务
        service.export();

        new Thread(new Runnable() {
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(40000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}
